package org.jeecg.modules.message.wechat;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.*;
import java.util.Enumeration;

@RestController
@RequestMapping("/weixin")
public class TokenControl {

    @Autowired
    FuWuHaoMessageService fuWuHaoMessageService;

    private void getHttpServletRequestInfo(HttpServletRequest request) {

        try {
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append("--------------------------reqHeadInfos---------------------------------");
            Enumeration<String> reqHeadInfos = request.getHeaderNames();
            while (reqHeadInfos.hasMoreElements()) {
                String headName = (String) reqHeadInfos.nextElement();
                String headValue = request.getHeader(headName);//根据请求头的名字获取对应的请求头的值
                stringBuilder.append(headName).append(":").append(headValue).append(";");
            }

            stringBuilder.append("\n--------------------------parameterNames---------------------------------\n");
            Enumeration<String> parameterNames = request.getParameterNames();
            while (parameterNames.hasMoreElements()) {
                String parameterName = (String) parameterNames.nextElement();
                String parameterValue = request.getParameter(parameterName);//根据请求头的名字获取对应的请求头的值
                stringBuilder.append(parameterName).append(":").append(parameterValue).append(";");
            }
            stringBuilder.append("\n--------------------------body---------------------------------\n");
            BufferedReader br = null;
            StringBuilder body = new StringBuilder("");
            try {
                br = request.getReader();
                String str;
                while ((str = br.readLine()) != null) {
                    body.append(str);
                }
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (null != br) {
                    try {
                        br.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            stringBuilder.append("body:").append(body).append(";");

            stringBuilder.append("\n--------------------------Session---------------------------------\n");
            HttpSession httpSession = request.getSession();
            stringBuilder.append("SessionID:").append(httpSession.getId()).append(";");
            Enumeration<String> attributeNames = httpSession.getAttributeNames();
            while (attributeNames.hasMoreElements()) {
                String parameterName = (String) attributeNames.nextElement();
                Object parameterValue = httpSession.getAttribute(parameterName);//根据请求头的名字获取对应的请求头的值
                stringBuilder.append(parameterName).append(":").append(parameterValue.toString()).append(";");
            }
            stringBuilder.append("\n--------------------------Cookie---------------------------------\n");
            Cookie[] cookies = request.getCookies();
            if (cookies != null) {
                for (Cookie cookie : cookies) {
                    String cookieName = cookie.getName();
                    String cookieValue = cookie.getValue();//根据Cookie的名字获取对应的请求头的值
                    stringBuilder.append(cookieName).append(":").append(cookieValue).append(";");
                }
            }

            stringBuilder.append("\n----------------------------other-------------------------------\n");
            stringBuilder.append("characterEncoding:").append(request.getCharacterEncoding()).append(";");
            stringBuilder.append("getContentLength:").append(request.getContentLength()).append(";");
            stringBuilder.append("getContentType:").append(request.getContentType()).append(";");
            stringBuilder.append("getAuthType:").append(request.getAuthType()).append(";");
            stringBuilder.append("getMethod:").append(request.getMethod()).append(";");

            stringBuilder.append("isRequestedSessionIdValid:").append(request.isRequestedSessionIdValid()).append(";");
            stringBuilder.append("isRequestedSessionIdFromCookie:").append(request.isRequestedSessionIdFromCookie()).append(";");
            stringBuilder.append("isRequestedSessionIdFromURL:").append(request.isRequestedSessionIdFromURL()).append(";");

            System.out.println("getHttpServletRequestInfo: " + stringBuilder.toString());

        } catch (Exception e) {
            System.out.println("getHttpServletRequestInfo: " + e);
        }
    }

    /**
     * 微信消息接收和token验证
     */
    @RequestMapping(value = "/token")
    public String get(HttpServletRequest request, HttpServletResponse response) throws Exception {
//        getHttpServletRequestInfo(request);
        System.out.println("----------------验证微信服务号信息开始----------");
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        // 微信加密签名
        String signature = request.getParameter("signature");
        // 时间戳
        String timestamp = request.getParameter("timestamp");
        // 随机数
        String nonce = request.getParameter("nonce");
        // 随机字符串
        String echostr = request.getParameter("echostr");

        // 通过检验signature对请求进行校验，若校验成功则原样返回echostr，表示接入成功，否则接入失败
        if (SignUtil.checkSignature(signature, timestamp, nonce)) {
            System.out.println("----验证服务号结束.........");
            return echostr;
        } else {
            return null;
        }
    }//public

    @RequestMapping(value = "/sendMsg", method = RequestMethod.GET)
    public void sendMessage() {
        fuWuHaoMessageService.SendNewOrderWxMsg(null);
    }


    public void notifyFllowEvent() {

    }


}
